/**
 * @author : xwj
 * @date : 2021/9/21 23:30
 * @description : 给定一个链表，两两交换其中相邻的节点，并返回交换后的链表。
 * @class : test24
 **/

public class test24 {

    public static class ListNode {
      int val;
      ListNode next;
      ListNode() {}
      ListNode(int val) { this.val = val; }
      ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    }

    //1. 0 ms	35.8 MB
    /*
    *   思路：
    *       设置一个头结点用来存储head的信息，便于返回头结点
    *       将head和其后面一个节点的位置进行交换，将head设置为head.next，即下一次交换的第一个节点
    *       判断head和head.next是否为空，为空则退出。
    *  */
    public static ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode pre = new ListNode(0, head);
        ListNode p = pre;
        while (head != null && head.next != null) {
            ListNode t = head.next;
            head.next = head.next.next;
            t.next = head;
            p.next = t;
            p = p.next.next;
            head = head.next;
        }
        return pre.next;
    }

    public static void main(String[] args) {
        ListNode tail = new ListNode(3);
        ListNode tmp = new ListNode(2, tail);
        ListNode head = new ListNode(1, tmp);

        ListNode n = swapPairs(head);

        while (n != null) {
            System.out.println(n.val);
            n = n.next;
        }
    }

}
